package dp.dao;

import java.util.List;
import java.util.Map;

import org.mybatis.spring.SqlSessionTemplate;

/**
 * 通用DAO接口
 * @author chensh
 */
public interface GenericDao {
    /**
     * 取数据库类型
     * @return 返回小写的字符串：oracle、db2、mysql
     */
    String getDatabaseName();
	/**
	 * 判断数据库是不是Oracle
	 * @return true-是Oralce false-不是Oracle
	 */
	boolean isOracle();
	/**
     * 判断数据库是不是Db2
     * @return true-是Db2 false-不是Db2
     */
	boolean isDB2();
	/**
     * 判断数据库是不是SQLServer
     * @return true-是SQLServer false-不是SQLServer
     */
	boolean isSQLServer();
	/**
     * 判断数据库是不是MySQL
     * @return true-是MySQL false-不是MySQL
     */
	boolean isMySql();
	/**
     * 判断数据库是不是PostgreSql
     * @return true-是PostgreSql false-不是PostgreSql
     */
	boolean isPostgreSql();
	
	SqlSessionTemplate getSqlSessionTemplate();
	
	/**
	 * 判断表名是否存在
	 * @param tableName 表名
	 * @return 是否有表
	 */
	boolean hasTable(String tableName);
	
	/**
	 * 插入一个对象
     * @param statement 查询结果的statement
     * @param parameterObject 参数
	 */
    void insert(String statement, Object parameterObject);
    
    /**
     * 更新一个对象
     * @param statement 查询结果的statement
     * @param parameterObject 参数
     * @return 更新的记录数
     */
    int update(String statement, Object parameterObject);
    
    /**
     * 删除一个对象
     * @param statement 查询结果的statement
     * @param parameterObject 参数
     * @return 影响的记录数
     */
    int delete(String statement, Object parameterObject);
    
    /**
     * 查询一个对象
     * @param statement 查询结果的statement
     * @param parameterObject 参数
     * @param clazz 返回类型
     * @return 查询结果
     */
    <T> T queryForObject(String statement, Object parameterObject, Class<T> clazz);
    
    /**
     * 查询一个对象
     * @param statement 查询结果的statement
     * @param parameterObject 参数
     * @param clazz 返回类型
     * @param transformMapFieldname 是否转换Map类型字段名
     * @return 查询结果
     */
    <T> T queryForObject(String statement, Object parameterObject, Class<T> clazz, boolean transformMapFieldname);
    
    /**
     * 查询结果集
     * @param statement 查询结果的statement
     * @param parameterObject 参数
     * @param clazz 返回类型
     * @return 查询结果
     */
    <T> List<T> queryForList(String statement, Object parameterObject, Class<T> clazz);
    
    /**
     * 查询结果集
     * @param statement 查询结果的statement
     * @param parameterObject 参数
     * @param clazz 返回类型
     * @param transformMapFieldname 是否转换Map类型字段名
     * @return 查询结果
     */
    <T> List<T> queryForList(String statement, Object parameterObject, Class<T> clazz, boolean transformMapFieldname);
    
    /**
     * 分页查询
     * @param pageIndex 页数
     * @param limit 一页的记录数
     * @param clazz 返回类型
     * @return 查询结果
     */
    <T> PagingList<T> queryForPagingList(String statement, Object parameterObject, int pageIndex, int limit, Class<T> clazz);
    <T> PagingList<T> queryForPagingList(String statement, Object parameterObject, int pageIndex, int limit, Class<T> clazz, boolean transformMapFieldname);
    
    //批量操作
    void batchInsert(final String statement, final List<?> list);
    void batchDelete(final String statement, final List<?> list);
    void batchUpdate(final String statement, final List<?> list);
    
    //SQL操作
    void inserBySQL(String sql);
    int updateBySQL(String sql);
    int deleteBySQL(String sql);
    
    /**
     * 通过SQL查询，返回Map，存放String的键值和Value
     * @param sql
     * @return
     */
    Map queryForObjectBySQL(String sql);
    /**
     * 通过SQL查询，返回List<Map>，存放String的键值和Value
     * @param sql
     * @return
     */
    List<Map> queryForListBySQL(String sql);
    
    void batchInsertBySQL(List<String> sql);
    void batchUpdateBySQL(List<String> sql);
    void batchDeleteBySQL(List<String> sql);
}
